package pt.iscte.dcti.es.rhplus.sistema;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public class UtensiliosParaDatas {

    public static String devolveDataEmString(final int ano, final int mes, final int dia) {
        // Criar a data a partir dos tres campos acima.
        GregorianCalendar calendario_gregoriano = new GregorianCalendar(ano, mes - 1, dia);
        Date data_de_nascimento = calendario_gregoriano.getTime();

        String date_out;
        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("yyyy-MM-dd");
        date_out = date_formatter.format(data_de_nascimento);

        return date_out;
    }

    public static int dateDiff(int data1, int data2) throws Exception {

        Date diff = new Date();

        /*diff.setTime(Math.abs(data1.getTime() - data2.getTime()));
        long timeDiff = diff.getTime();
        long dias = (long) Math.floor(timeDiff/(1000*60*60*24));
        String result= String.valueOf(dias);
        int resultf=Integer.parseInt(result);
        System.out.println("* "+timeDiff+" "+dias+" "+resultf);
        return  (resultf/365);         */
        System.out.println((data1) + " " + data2);
        return (Math.abs((data1) - data2));
    }

    public static String devolveDataActualPorExtenso() {
        // Criar a data a partir dos tres campos acima.
        Date data = new Date();

        String ano, mes, dia, semana;

        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("EEEE");
        semana = date_formatter.format(data);

        date_formatter = new SimpleDateFormat("yyyy");
        ano = date_formatter.format(data);

        date_formatter = new SimpleDateFormat("MMMM");
        mes = date_formatter.format(data);

        date_formatter = new SimpleDateFormat("d");
        dia = date_formatter.format(data);

        return semana + ", dia " + dia + " de " + mes + " de " + ano;
    }

    public static String devolveDataEHoraEmString(final int ano, final int mes, final int dia, final int hora, final int minutos) {
        // Criar a data a partir dos tres campos acima.
        GregorianCalendar calendario_gregoriano = new GregorianCalendar(ano, mes - 1, dia, hora, minutos);
        Date data = calendario_gregoriano.getTime();

        String date_out;
        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        date_out = date_formatter.format(data);

        return date_out;
    }

    public static String devolveHoraDaData(final Date data) {
        // Criar a data a partir dos tres campos acima.
        String date_out;
        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("HH");
        date_out = date_formatter.format(data);

        return date_out + ":00";
    }

    public static String devolveDataEmStringLonga(final int ano, final int mes) {
        // Criar a data a partir dos tres campos acima.
        GregorianCalendar calendario_gregoriano = new GregorianCalendar(ano, mes - 1, 1);
        Date data_de_nascimento = calendario_gregoriano.getTime();

        String date_out;
        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("MMMM");
        date_out = date_formatter.format(data_de_nascimento) + " de ";
        date_formatter = new SimpleDateFormat("yyyy");
        date_out += date_formatter.format(data_de_nascimento);

        return date_out;
    }

    public static Date devolveData(final int ano, final int mes, final int dia) {
        // Criar a data a partir dos tres campos acima.
        GregorianCalendar calendario_gregoriano = new GregorianCalendar(ano, mes - 1, dia);
        Date data_de_nascimento = new Date(calendario_gregoriano.getTimeInMillis());

        return data_de_nascimento;
    }

    public static String converteParaString(Date data) {
        String date_out;
        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("yyyy-MM-dd");
        date_out = date_formatter.format(data);

        return date_out;
    }

    public static String devolveAnoDaData(Date data) {
        String date_out;
        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("yyyy");
        date_out = date_formatter.format(data);

        return date_out;
    }

    public static String devolveMesDaData(Date data) {
        String date_out;
        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("MM");
        date_out = date_formatter.format(data);

        return date_out;
    }

    public static String devolveDiaDaData(Date data) {
        String date_out;
        SimpleDateFormat date_formatter;

        date_formatter = new SimpleDateFormat("dd");
        date_out = date_formatter.format(data);

        return date_out;
    }

    /**
     * Client with more then 18 and birthdates not in the future
     * 
     */
    public static boolean eValida(final int ano, final int mes, final int dia) {

        if (ano < 1900) {
            return false;
        }


        if (mes < 1 || mes > 12) {
            return false;
        }

        switch (mes) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                if (dia <= 0 || dia > 31) {
                    return false;
                }
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                if (dia <= 0 || dia > 30) {
                    return false;
                }
                break;
            case 2:
                if ((ano % 4 == 0) && ((ano % 100 != 0) || (ano % 400 == 0))) {
                    if (dia <= 0 || dia > 29) {
                        return false;
                    }
                    break;
                } else {
                    if (dia < 0 || dia > 28) {
                        return false;
                    }
                    break;
                }
        }
        return true;
    }

    public static boolean maiorDeIdade(final int ano, final int mes, final int dia) {

        int dia_actual = agora().getDay();
        //  int mes


        return true;
    }

    public static int diasDoMes(final int mes, final int ano) {

        switch (mes) {
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
            case 2:
                if ((ano % 4 == 0) && ((ano % 100 != 0) || (ano % 400 == 0))) {
                    return 29;
                } else {
                    return 28;
                }

            default: // (1,3,5,6,7,10,12)
                return 31;
        }
    }

    public static boolean eMaiorDoQue(final Date maior, final Date menor) {
        return maior.compareTo(menor) > 0;
    }

    public static Date agora() {
        return new Date();
    }
}
